package com.jindy.jpush.utils;

import com.alibaba.fastjson2.JSON;
import com.jindy.common.core.domain.AjaxResult;
import com.jindy.jpush.domain.UniPushDomain;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author yqq
 * @date 2023/4/8
 * @Description uniapp消息推送
 */
@RestController
@RequestMapping("/api")
public class UniJpushUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(UniJpushUtils.class);
    /**
     * 设置连接超时时间，单位毫秒。
     */
    public final static int CONNECT_TIMEOUT = 30000;
    /**
     * 设置从connect Manager获取Connection 超时时间，单位毫秒。这个属性是新加的属性，因为目前版本是可以共享连接池的。
     */
    public final static int CONNECT_REQUEST_TIMEOUT = 10000;

    /**
     * 请求获取数据的超时时间，单位毫秒。 如果访问一个接口，多少时间内无法返回数据，就直接放弃此次调用。
     */
    public final static int SOCKET_TIMEOUT = 30000;

    /**
     * 消息推送url
     */
    public static final String SEND_MESSAGE_URL = "https://fc-mp-c30f02a2-29ca-485e-af41-1c134be8e609.next.bspapp.com/test";

    /**
     * 发送审批消息通知
     * @param cids 设备id
     * @return
     */
    public static AjaxResult sendApproveMessage(List<String> cids){
        UniPushDomain uniPushDomain = new UniPushDomain(cids,"湿云","您有一条新的订单，请审批。");
        return doPost(uniPushDomain);
    }

    /**
     * 发送抄送消息通知
     * @param cids 设备id
     * @return
     */
    public static AjaxResult sendCopyMessage(List<String> cids){
        UniPushDomain uniPushDomain = new UniPushDomain(cids,"湿云","您有一条新的订单，请查看。");
        return doPost(uniPushDomain);
    }

    /**
     * uniapp消息推送
     * @param uniPushDomain
     * @return
     */
    @GetMapping("/sendMessage")
    public static AjaxResult doPost(UniPushDomain uniPushDomain){
        try {
            LOGGER.info("发送消息推送："+uniPushDomain.toString());
            return doPostAndHeader(SEND_MESSAGE_URL, uniPushDomain);
        } catch (Exception e) {
            LOGGER.error("uniapp消息推送失败:",e);
            return AjaxResult.error("uniapp消息推送失败");
        }
    }

    /**
     * 1.带参数的post请求 body形式
     * 2.添加请求头header参数token
     * 3.设置超时时长
     *
     * @param url
     * @param domain
     * @return
     * @throws Exception
     */
    public static AjaxResult doPostAndHeader(String url, UniPushDomain domain) throws Exception {
        // 1. 声明httppost
        HttpPost httpPost = new HttpPost(url);

        //2. 把body参数设置到HttpPost中
        httpPost.setEntity(new StringEntity(JSON.toJSONString(domain),"utf-8"));
        /*
         * 添加请求头信息
         */
        // 浏览器表示
        httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)");
        // 传输的类型
        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
        //在请求头header中添加token参数
        // httpPost.addHeader(tokenK, tokenV);

        // 3. 使用Httpclient发起请求
        CloseableHttpClient httpclient = HttpClients.createDefault();
        RequestConfig requestConfig = RequestConfig.custom()
                //设置连接超时时间，单位毫秒。
                .setConnectTimeout(CONNECT_TIMEOUT)
                //设置从connect Manager获取Connection 超时时间，单位毫秒。这个属性是新加的属性，因为目前版本是可以共享连接池的。
                .setConnectionRequestTimeout(CONNECT_REQUEST_TIMEOUT)
                //请求获取数据的超时时间，单位毫秒。 如果访问一个接口，多少时间内无法返回数据，就直接放弃此次调用。
                .setSocketTimeout(SOCKET_TIMEOUT)
                .build();
        httpPost.setConfig(requestConfig);
        CloseableHttpResponse response = httpclient.execute(httpPost);

        // 4. 解析返回数据，封装HttpResult
        // 4.1状态码
        int code = response.getStatusLine().getStatusCode();
        // 4.2 响应体内容
        String body = null;
        if (response.getEntity() != null) {
            body = EntityUtils.toString(response.getEntity(), "UTF-8");
        }

        return new AjaxResult(code,body);
    }
}
